package designModel;

// 抽象工厂（AbstractFactory）模式：提供一个创建产品族的接口，其每个子类可以生产一系列相关的产品。
// 抽象工厂
// 简单工厂 与 抽象工厂的区别 在于 抽象工厂根据业务场景有对应多个工厂 而简单工厂只有一个工厂
//发动机以及型号
// 引擎接口
interface Engine {}

class EngineA implements Engine {
    public EngineA(){
        System.out.println("制造-->EngineA");
    }
}
class EngineB implements Engine{
    public EngineB(){
        System.out.println("制造-->EngineB");
    }
}

// 空调空调以及型号
interface Aircondition {}

class AirconditionA implements Aircondition {
    public AirconditionA(){
        System.out.println("制造-->AirconditionA");
    }
}
class AirconditionB implements Aircondition{
    public AirconditionB(){
        System.out.println("制造-->AirconditionB");
    }
}


//创建工厂的接口（ 造一系列东西  造什么东西都要在这里声明出来）
interface AbstractFactory {
    //制造发动机
    public Engine createEngine();
    //制造空调
    public Aircondition createAircondition();
}

//为宝马320系列生产配件
// 具体造什么  创建对象实例时，不是自己直接 new 类, 而是把这个new 类的动  作放在一个工厂的方法
class FactoryBMW3200 implements AbstractFactory{
    @Override
    public Engine createEngine() {
        return new EngineA();
    }
    @Override
    public Aircondition createAircondition() {
        return new AirconditionA();
    }
}
//宝马523系列
// 具体造什么
class FactoryBMW5230 implements AbstractFactory {
    @Override
    public Engine createEngine() {
        return new EngineB();
    }
    @Override
    public Aircondition createAircondition() {
        return new AirconditionB(); //创建对象实例时，不要直接 new 类, 而是把这个new 类的动  作放在一个工厂的方法
    }
}

class Test implements AbstractFactory{
    //制造发动机
    @Override
    public Engine createEngine() {
        return null;
    }

    //制造空调
    @Override
    public Aircondition createAircondition() {
        return null;
    }

    public static void main(String[] args) {
        System.out.println("测试抽象工厂");




        FactoryBMW5230 factoryBMW5230 = new FactoryBMW5230();
        Engine engine = factoryBMW5230.createEngine();
        Aircondition aircondition = factoryBMW5230.createAircondition();

        FactoryBMW3200 factoryBMW3200 = new FactoryBMW3200();
        Engine engine1 = factoryBMW3200.createEngine();
        Aircondition aircondition1 = factoryBMW3200.createAircondition();
    }
}

/*
    1 工厂方法只有一个抽象产品类和一个抽象工厂类，但可以派生出多个具体产品类和具体工厂类，每个具体工厂类只能创建一个具体产品类的实例。
    2 抽象工厂模式拥有多个抽象产品类（产品族）和一个抽象工厂类，每个抽象产品类可以派生出多个具体产品类；抽象工厂类也可以派生出多个具体工厂类，
      同时每个具体工厂类可以创建多个具体产品类的实例  */
